/**
 * @Author: Jiang Zhongxun
 * @Date: 2024-10-03 22:11:31
 * @FilePath: /practiceProject/include/server/server.h
 * @Description: 服务端
 */
#ifndef _SERVER_H_
#define _SERVER_H_

#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <pthread.h>
#include <signal.h>
#include <sqlite3.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/epoll.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/un.h>
#include <sys/wait.h>
#include <syslog.h>
#include <unistd.h>

#define THREAD_POOL_SIZE 5 // 线程池大小
#define MAX_EVENTS 1024    // 最大事件数
#define BUF_SIZE 1024      // 缓冲区大小
#define TIMEOUT 10000      // 超时时间
#define QUEUE_SIZE 100     // 队列大小

// 互斥锁和条件变量
pthread_mutex_t queueMutex;
pthread_cond_t queueCond;

// 定义任务结构
typedef struct Task
{
    int client_fd;
} Task;

// 任务队列(尾插头取)
typedef struct TaskQueue
{
    Task tasks[QUEUE_SIZE]; // 用来存放任务的数组
    int front;              // 队列头部索引，指向下一个将要被取出的任务
    int rear;               // 队列尾部索引，指向下一个将要插入任务的位置
    pthread_mutex_t lock;
    pthread_cond_t notify;
} TaskQueue;

/* 线程池结构体 */
typedef struct
{
    pthread_t threads[THREAD_POOL_SIZE];
    TaskQueue task_queue;
} ThreadPool;

/* 初始化线程池 */
void init_thread_pool(ThreadPool *pool);

/* 销毁线程池 */
void destroy_thread_pool(ThreadPool *pool);

/* 工作线程 */
void *worker_thread(void *arg);

/* 任务队列入队 */
void enqueue(TaskQueue *queue, Task task);

/* 任务队列出队 */
Task dequeue(TaskQueue *queue);

/* 任务队列是否为空 */
int isTaskQueueEmpty(TaskQueue *queue);

/* 服务端通信 */
int tcpServerCom(int newfd);

/* 字符串解析 */
int parseStringUtil(char allbuf[], char *result[]);

#endif
